//
//  STStatusViewModel.swift
//  STVVeibo
//
//  Created by leergou on 16/7/24.
//  Copyright © 2016年 WhiteHouse. All rights reserved.
//

import UIKit

// 该viewModel 为 cell 服务
class STStatusViewModel: NSObject {
    
    // 定义模型属性
    var status:STStatus?
    // 微博认证图片
    var avatarImage: UIImage?
    // 会员等级图片
    var memberImage: UIImage?
    // 微博来源处理富文本 --> 这是第二种方法-MVVM 思想,第一种方法MVC思想,在 status 中处理富文本
    var sourceAttr: NSMutableAttributedString?
    // 转发数
    var repostsCount: String?
    // 评论数
    var commentsCount: String?
    // 赞数
    var attitudesCount: String?
    // 格式化后的微博时间
    var creatTime: String?{
        return NSDate.getFormatDate(status?.created_at ?? "")?.dateDescription
    }
    // 原创微博富文本
    var originalContentAttr: NSMutableAttributedString?
    // 转发微博富文本
    var retweetContentAttr: NSMutableAttributedString?
    
    
    // 重载构造函数
    // 在调用重载函数的时候,要对 avatarImage 和 memberImage 赋值 
    // 存储型属性,不需要事实计算
    init(status:STStatus) {
        super.init()
        self.status = status
        self.avatarImage = getavatarImage(status.user?.verified)
        self.memberImage = getMemberImage(status.user?.mbrank)
        self.sourceAttr = getSourceAttr(status.source)
        self.repostsCount = getSinaCount(status.reposts_count, title: "转发")
        self.commentsCount = getSinaCount(status.comments_count, title: "评论")
        self.attitudesCount = getSinaCount(status.attitudes_count, title: "赞")
        self.originalContentAttr = dealContentText(status.text)
        self.retweetContentAttr = dealContentText(status.retweeted_status?.text)
    }
}


//MARK: 微博内容富文本处理
// 处理表情字符串
//MARK: - 处理表情字符创
func dealContentText(text: String?) -> NSMutableAttributedString?{
    // 判断是否有值
    guard let t = text else {
        return nil
    }
    // 若传入的字符串不为空,则根据字符串创建一个富文本
    let alltextAttr = NSMutableAttributedString(string: t)
    // 正则格式
    let regex = "\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]"
    // 遍历字符串
    /*
    -01 匹配的个数
    -02 匹配的结果（指针）
    -03 匹配的范围（指针）
    -04 匹配是否停止
    */
    // 创建一个可变临时数组
    var tempArray: [STMatchResult] = [STMatchResult]()
    (t as NSString).enumerateStringsMatchedByRegex(regex) { (count, string, range, _) -> Void in
        
        // 创建一个模型
        let matchResult = STMatchResult(string: string.memory as? String, range: range.memory)
        // 添加到数组
        tempArray.append(matchResult)
    }
    // 倒序遍历数组,替换富文本中的图片字符串为图片 -> 正序遍历,前面的替换会改变后面的 range,导致出现越界
    for match in tempArray.reverse() {
        // 根据匹配到的结果字符串,到一维数组中查找表情,并判断查找结果是否为nil
        guard let emoticon = STEmoticonTools.emoticonSharedTools.searchEmoticons(match.string) else {
            continue
        }
        
        //如果有对应的模型,则定义 行高
        let lineHeight = UIFont.systemFontOfSize(15).lineHeight
        // 定义一个不可变富文本
        let attr = NSAttributedString(emoticon: emoticon, y: -4, lineHeight: lineHeight)
        
        // 进行替换
        alltextAttr.replaceCharactersInRange(match.range, withAttributedString: attr)
    }
    return alltextAttr
}


//MAKR: 处理转发 评论 赞
extension STStatusViewModel{
    func getSinaCount(count: Int,title: String) -> String {
        
        if count <= 0 {
            return title
        } else {
            
            if count < 100 {
                return "\(count)"
            } else {
                let sinaCount = CGFloat(count/1000)/10
                // 字符串拼接
                var sinaCountStr = "\(sinaCount)万"
                // 如果字符串包含 .0 ,则替换掉
                if sinaCountStr.containsString(".0"){
                    // 字符串替换
                    sinaCountStr = sinaCountStr.stringByReplacingOccurrencesOfString(".0", withString: "")
                }
                return sinaCountStr
            }
        }
    }
}

//MAKR: 处理文博来源富文本
// MVC思想:处理 微博来源的 函数
extension STStatusViewModel{
    
    func getSourceAttr(source: String?) -> NSMutableAttributedString{
        
        guard let s = source where s.containsString("\">") else {
            let str = "iPhone手机"
            return switchToStringAttr(str)
        }
        //  rel=\"nofollow\">皮皮时光机</a>"
        let startRange = s.rangeOfString("\">")!
        let endRange = s.rangeOfString("</")!
        // 截取字符创
        let result = s.substringWithRange(startRange.endIndex..<endRange.startIndex)
        return switchToStringAttr(result)
    }
    
    // 将截取的字符串转成富文本格式
    func switchToStringAttr(result: String) -> NSMutableAttributedString{
        // 最终显示格式
        let result = "来自 " + result
        // 创建 range
        let range = (result as NSString).rangeOfString("来自")
        // 创建一个可变富文本
        let attr = NSMutableAttributedString(string: result)
        // 设置富文本属性
        attr.addAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], range: range)
        
        return attr
    }
}


//MARK: 获取微博认证图片
extension STStatusViewModel{
    // 处理微博认证用户图片/// 认证类型 -1：没有认证，1，认证用户，2,3,5: 企业认证，220: 达人
    
    func getavatarImage(verified: Int?) -> UIImage?{
    
        guard let ver = verified else {
            
            return nil
        }
        switch ver {
            
        case 1:
            return UIImage(named: "avatar_vip")
            
        case 2,3,5:
            return UIImage(named: "avatar_enterprise_vip")
            
        case 220:
            return UIImage(named: "avatar_grassroot")
            
        default:
            return UIImage(named: "avatar_vgirl")
        }
    }
}


//MARK: 获取会员等级图片
extension STStatusViewModel{
    
    func getMemberImage(mbrank: Int?) -> UIImage?{
        
        // 判断mbarank 是否Wie nil
        guard let mbr = mbrank else {
            return nil
        }
        
        if mbr > 0 && mbr < 7 {
            
            return UIImage(named: "common_icon_membership_level\(mbr)")
        }
        return UIImage(named: "common_icon_membership")
    }
}



extension STStatusViewModel{
    
    // 重写 父类已有的description 方法
    override var description: String{
        
        let keys = ["status","avatarImage","memberImage","repostsCount","commentsCount","attitudesCount"]
        return dictionaryWithValuesForKeys(keys).description
    }
}









